\chapter{Condiciones de Resolución y Corrección}
\section{Introducción}
\begin{enumerate}
	\item Se deberá tener en cuenta para la resolución TODAS las condiciones que se enuncian.
	\item Se deben respetar los formatos de archivos especificados.
	\item Se debe respetar la estructura de directorios planteada.
	\item Cada comando deberá ser resuelto utilizando el lenguaje indicado.
	\item El día de vencimiento del TP, cada ayudante convocará a los integrantes de un grupo e comenzará la corrección mediante una entrevista grupal. Es imprescindible la presencia de todos los integrantes del grupo el día de la corrección. El objetivo de esto es comprender la dinámica de trabajo del equipo y los roles desempeñados por cada uno.
	\item Posterior a la entrega se podrá acordar entre el Ayudante y el Grupo el intercambio de correspondencia a través de la cuenta so7508@gmail.com. Por este medio el ayudante podrá solicitar a los alumnos correcciones, mejoras en las instrucciones de ejecución, nuevos juego de datos, etc. Cabe aclarar que todos los mensajes a esta casilla deberán tener como asunto “GrupoX” (x es el número asignado al grupo) para poder redireccionar el mail al ayudante correspondiente.
	\item Dentro de los ítems a chequear el ayudante evaluará aspectos formales (como ser la forma de presentación de la carpeta), aspectos funcionales (como ser que el TP funcione) y aspectos operativos: que el TP resuelva el problema planteado.
\end{enumerate}

\section{Documentación a Presentar}
Se deberá hacer entrega de:
\begin{itemize}
	\item Una Carpeta de Trabajo Práctico con el contenido solicitado mas adelante. En el pie de cada hoja se debe incluir: Número de Grupo y Tema (en el margen izquierdo) y Número de Hoja (en el margen derecho). TODAS las hojas deberán estar numeradas y enganchadas a una carpeta. Las hojas sueltas no se considerarán como parte de la misma.
	\item Un archivo con el formato y contenido solicitado más adelante.
\end{itemize}

\section{Contenido de la Carpeta}
\begin{enumerate}
	\item {\bf Carátula:} La entregada en este mismo documento con los datos completos en 2 COPIAS.
	\item {\bf Índice del Contenido de la Carpeta.}
	\item {\bf Hipótesis y Aclaraciones:} todas las hipótesis que han sido consideradas en la resolución del TP y cualquier otra aclaración que se considere necesaria.
	\item {\bf Problemas relevantes:} Enumeración de los problemas relevantes que se les hayan presentado durante el desarrollo y prueba de los comandos y como los solucionaron.
	\item {\bf Archivo README}
	\item {\bf Comandos:}
	\begin{enumerate}
		\item Nombre del Comando.
		\item Input.
		\item Output
		\item Invocación,  Opciones y Parámetros.
		\item Descripción
		\begin{enumerate}
			\item Narrativa (ídem al texto incluido en este documento).
			\item Justificación de su uso (solo para los comandos auxiliares).
			\item Pasos Sugeridos (ídem al texto incluido en este documento).
		\end{enumerate}
		\item Código del comando: incluir comentarios útiles para la comprensión del código.
	\end{enumerate}
	\item {\bf Archivos:}
	\begin{enumerate}
		\item {\bf Archivos del enunciado:} Por cada archivo del enunciado indicar:
		\begin{enumerate}
			\item Nombre del Archivo.
			\item Estructura.
		\end{enumerate}
		\item {\bf Archivos auxiliares:} Por cada archivo auxiliar que se utilice indicar: 
		\begin{enumerate}
			\item Nombre del Archivo.
			\item Justificación de su uso, quienes lo usan.
			\item Estructura.
		\end{enumerate}
	\end{enumerate}
	\item {\bf Condiciones de resolución y corrección} (ídem al texto incluido en este documento).
	\item Glosario.
\end{enumerate}

\section{Formato y contenido del Archivo}
El archivo de Trabajo Práctico deberá ser enviado a la cuenta \emph{so7508@gmail.com} dentro de las 24hs posteriores a la corrección. Deberá ser un único archivo instalable en formato “.tgz” con todos los archivos y directorios empaquetados en un archivo “tar” y luego comprimido con “gzip”. 

MUY IMPORTANTE: cuando se efectúa el “tar” se debe usar la opción de “directorio relativo” para evitar problemas cuando se proceda a la instalación en la facultad para su corrección.

El instalable deberá contener:
\begin{itemize}
	\item Los scripts desarrollados (según se detallan mas adelante).
	\item Juego de datos de ejemplo y de prueba lo suficientemente variado como para contemplar todas las variantes posibles. Los archivos de prueba deben respetar las estructuras y directorios indicados en el enunciado ya que es uso y costumbre intercambiar datos entre los distintos grupos para enriquecer los testeos.
	\item Un archivo README con las instrucciones de instalación y cualquier otra indicación u observación que se quiera incorporar para que el ayudante pueda realizar los testeos.
	\item Cualquier otro archivo que el grupo considere necesario (ej: resultado de las pruebas por Uds. Efectuadas, logs, etc.)
\end{itemize}

\section{Observaciones a tener en cuenta en el desarrollo}
\begin{enumerate}
	\item Toda invocación desde un comando a otro debe devolver un código de retorno cero (0) si fue exitoso o distinto de cero si tuvo errores. Siempre al finalizar el comando se debe indicar si finalizó correctamente o con errores.
	\item En la descripción de los comandos se sugieren los pasos de ejecución. Estos deben considerarse indicativos, ya que el programador puede alterar este orden según su conveniencia siempre que no afecte el resultado final esperado. Se dan a los efectos de ordenar la explicación. Si Ud. considera conveniente modificar algún paso, tanto sea en el orden de ejecución o en la forma de resolverlo, no hay inconveniente, siempre que lo aclare debidamente en las hipótesis.
	\item {\bf Errores y Mensajes:}
		\begin{enumerate}
			\item Cuando se describen los comandos se hace referencia a errores y mensajes informativos, estas referencias son sólo una guía para el desarrollador, pueden existir errores no descriptos en el enunciado que deban ser manejados por el programador.
			\item Siempre se debe especificar el error con un mensaje amigable.
			\item Es conveniente para el seguimiento y corrección de los comandos que a medida que se avanza en la ejecución del mismo se vayan mostrando por consola mensajes descriptivos indicando el punto de avance y resultados intermedios.
			\item Es conveniente que trabajen usando un archivo centralizado de mensajes de error  para que de esta manera se estandaricen. Esto hablará no sólo de la calidad del trabajo sino del grado de integración del grupo.
		\end{enumerate}
	\item {\bf Archivos de Log:}
		\begin{enumerate}
			\item Varios de los comandos deben grabar un archivo de Log llamados: <nombre del comando>.log
			\item En cada archivo de log se debe grabar todos los mensajes que se muestran por la consola del operador (3.c) y los mensajes de los errores que se produzcan (3.b).
			\item La escritura en el archivo de Log debe ser homogénea para todos los comandos que generan registros de log.
			\item Cada línea de log debe contener al menos: 

			\begin{verbatim}Fecha y hora actual, Usuario y Mensaje \end{verbatim}
		\end{enumerate}
\end{enumerate}

\newpage
\chapter{Enunciado – Segmentación de Clientes}
La Empresa MiTel desea desarrollar un sistema software denominado Segmentar que le permita ir procesando archivos que contienen registros de información de clientes que se detectan mediante un proceso eterno, validarlos y completarlos para luego efectuar la segmentación para campañas de telemarketing ADSL.

El sistema software Segmentar deberá estar compuesto por:
\begin{itemize}
	\item Un shell script denominado {\ttfamily iniciar} que efectúa la inicialización de ambiente.
	\item Un shell script denominado {\ttfamily detectar} que detecta el arribo de archivos
	\item Un shell script denominado {\ttfamily truncar} que limita el crecimiento indiscriminado de logs
	\item Un shell script denominado {\ttfamily auditar} para validar y completar la información de clientes
	\item Un programa Perl denominado {\ttfamily segmentar.pl} que genera la segmentación de clientes (opción g) y emite informes de campañas (opción e).
	\item Un shell script denominado mover que se emplea para mover archivos de un directorio a otro.
	\item Y finalmente un shell script denominado instalars que permite la instalación de lo anterior.
\end{itemize}

\section{Comando de Instalación}
{\large Nombre del Comando: {\bf INSTALARS}}

{\large Archivos de Input}
\begin{itemize}
	\item Archivos de la instalación
\end{itemize}
{\large Archivos de Output}
\begin{itemize}
	\item Comandos 
	\item Archivo de Configuración
	\item Datos de Prueba
	\item Tablas de Parámetros
	\item Archivo de Log
	\item Otros a especificar por el desarrollador.
\end{itemize}
{\large Opciones y Parámetros}
\begin{itemize}
	\item A especificar por el desarrollador.
\end{itemize}

{\large Descripción}

Este es el script para la instalación del paquete {\ttfamily Segmentar.} El script debe permitir instalar todos los comandos al mismo tiempo, o de a uno por vez. 

Debe grabar un log exhaustivo de su ejecución.

Cuando este script interactúa con el usuario, el valor por omisión propuesto (o valor default) se debe mostrar entre paréntesis ().

Siempre que este proceso cancele, mostrar (y grabar en el log)  el siguiente mensaje:

\begin{verbatim}"Proceso de instalación cancelado"\end{verbatim}

Los usuarios disponibles son solo tres: prueba01(pw test01), prueba02 (pw test02), prueba03 (pw test03).

Debido a esto cada grupo deberá crear un subdirectorio llamado grupoxx (donde xx es el nro de grupo). Si desean agregar subdirectorios a grupoxx pueden hacerlo.

Antes de comenzar la ejecución de INSTALARS es necesario copiar desde un medio externo el instalable.

Estos pasos deberán ser explicados dentro del instructivo de instalación (archivo README.txt), a modo de ejemplo podemos enumerar los siguientes pasos:

\begin{enumerate}
	\item Crear en el directorio corriente un subdirectorio grupoxx.
	\item ......
	\item Copiar el archivo *.tgz en...
	\item Descomprimir el *.tgz de manera de generar un *.tar
	\item Extraer los archivos del tar.
	\item ......
\end{enumerate}

Como resultado de esto debe quedar al menos:
\begin{itemize}
	\item Un subdirectorio /inst con todos los archivos relativos al paquete de instalación.
	\item Un subdirectorio /conf para uso posterior.
\end{itemize}
Ejemplos: {\bf /usr/prueba01/temp/grupo01/tp}/inst   {\bf /usr/prueba02/tmp/grupo21}/conf

El path previo de /inst y /conf debe ser el mismo. Todo el camino (path) previo que hayan elegido para ubicar estos subdirectorios lo llamaremos CURRDIR (lo marcado en negrita) para simplificar la explicación del enunciado. 

\subsubsection{Pasos sugeridos}
\begin{enumerate}
	\item {\bf Inicializar archivo de log de la instalación.}
	
	Este comando graba un archivo de Log cuyo nombre instalars.log. en el directorio \$CURRDIR/conf.
	
	En el archivo de log se deben registrar cada uno de los pasos de la instalación con todos los mensajes que se muestran por consola y todas las respuestas dadas por el instalador.
	
	Como resultado de esto se debe obtener una bitácora exhaustiva de la instalación. Cualquiera que desee podrá consultar allí la forma en que el paquete fue instalado. 

	Grabar en el Log:
	
	\begin{verbatim}<fecha y hora actual>-<Usuario>-Inicio de Ejecución. \end{verbatim}

	\item {\bf Mostrar (y grabar en el log)  el nombre del directorio de instalación.}

	\begin{verbatim}"Nombre del directorio de instalación: ($CURRDIR/inst)" \end{verbatim}

	\item {\bf Mostrar (y grabar en el log)  el nombre del directorio de parámetros de configuración.}

	\begin{verbatim}"Nombre del directorio de configuración: ($CURRDIR/conf)"} \end{verbatim}

	\item {\bf Detectar si Segmentar o alguno de sus componentes ya está instalado}

	Verificar la existencia del archivo \$CURRDIR/conf/segmentar.conf

	Si no existe, asumir que el paquete no fue instalado. Continuar en el siguiente punto.

	Si existe, ver que componentes están instalados. Para ello ir recorriendo el archivo de configuración y verificar que exista el comando (con el nombre indicado) en el directorio BINDIR indicado.

	\begin{enumerate}
		\item Si el paquete ya esta instalado, mostrar (y grabar en el log) el siguiente mensaje:
\begin{verbatim}
**************************************************************
* Se han detectado los siguientes componentes ya instalados: *
* Componente segmentar.pl: path completo, fecha y usuario    *
* Componente INICIAR: path completo, fecha y usuario         *
* Componente AUDITAR: path completo, fecha y usuario      *
* Componente TRUNCAR: path completo, fecha y usuario      *
* Componente DETECTAR: path completo, fecha y usuario     *
*                                                         *
*          Copyright TPSistemasOp (c)2009                 *
***********************************************************
Proceso de Instalación Cancelado
\end{verbatim}

		\item Si alguno de sus componentes no esta instalado:
		\begin{enumerate}
			\item mostrar mensaje con los componentes instalados.
			\item mostrar mensaje con los componentes que faltan.
			\item proponer la instalación de los faltantes.
			\item si el usuario acepta completar la instalación. 
			\begin{itemize}
				\item Si las variables datadir, logdir y maxlogsize ya están definidas en el configurador, tomar esos valores (el usuario no los puede cambiar en una reinstalación).
				\item En una reinstalación esta permitido modificar el directorio bindir para los comandos faltantes, los otros quedan como estaban.
			\end{itemize}
		\end{enumerate}
		\item Si ningún componente Segmentar esta instalado, continuar.
	\end{enumerate}

	\item {\bf Aceptación de términos y condiciones}
	
	Mostrar (y grabar en el log) el siguiente mensaje:
{\ttfamily
***************************************************
*      Proceso de Instalación de "Segmentar"      *
*          Copyright TPSistemasOp (c)2009         *
***************************************************
A T E N C I O N: Al instalar Segmentar UD. expresa 
aceptar los términos y condiciones del "ACUERDO DE 
LICENCIA DE SOFTWARE" incluido en este paquete. 

Acepta? Si –No
}

	Si el usuario no acepta, cancelar el proceso
	Si el usuario acepta, continuar
	Cualquier otra cosa, seguir en este punto 

	\item {\bf Chequear que Perl esté instalado}
	
	Para la instalación de Segmentar  es necesario chequear que Perl versión 5 o superior este instalado.
	
	Si está instalado mostrar (y grabar en el log)  un mensaje con la versión de perl detectada.

	Almacenar este valor en la variable PERLVER

	ACLARACION: Toda vez que se solicita “Almacenar tal valor en tal variable” es para facilitar la explicación de los pasos subsiguientes. 

	Si al chequear esto da error, entonces mostrar (y grabar en el log)  el siguiente mensaje:
	
	\begin{verbatim}"ATENCION! Esta instalación solo puede ser ejecutada si Perl 5 o superior esta instalado.
           Efectúe la instalación de Perl y reinicie el proceso de instalación." \end{verbatim}

	Cancelar el proceso.

	\item {\bf Definir el directorio de datos}
	
	Mostrar (y grabar en el log)  el siguiente mensaje:

	\begin{verbatim}"Nombre del directorio de datos: ($CURRDIR/datos)"\end{verbatim}

	Si el usuario acepta el nombre propuesto, continuar.
	
	Si el usuario lo desea cambiar, debe ingresar un nombre de directorio.

	Almacenar el nombre en la variable DATADIR.

	\item {\bf Mostrar (y grabar en el log)  el espacio disponible}

	\begin{verbatim}"Espacio disponible en $CURRDIR/$DATADIR: <cantidad> <unidad de medida>"\end{verbatim}

	Almacenar este valor en la variable DATASIZE.

	\begin{verbatim}"Desea continuar? Si –No"\end{verbatim}

	Si el usuario no acepta, cancelar el proceso.

	Si el usuario acepta, continuar.

	Cualquier otra cosa, seguir en este punto.

	\item {\bf Definir el directorio de logs para los comandos}
	
	Mostrar (y grabar en el log) el siguiente mensaje:

	\begin{verbatim}"Nombre del directorio de log: ($CURRDIR/log)"\end{verbatim}

	Si el usuario acepta el nombre propuesto, continuar.
	
	Si el usuario lo desea cambiar, debe ingresar un nombre de directorio.
	
	Almacenar el nombre en la variable LOGDIR.

	\item {\bf Definir el espacio máximo para logs}

	Calcular el espacio máximo para logs como el 10\% del DATASIZE.

	Mostrar (y grabar en el log) el siguiente mensaje:

	\begin{verbatim}"Espacio máximo para archivos de log? ($MAXLOGSIZE)<unidad de medida>"\end{verbatim}

	Si el usuario ingresa un valor menor al 10\% del DATASIZE, continuar.

	Si el usuario ingresa un valor mayor al 10\% del DATASIZE, entonces:
	
	Mostrar un mensaje indicando cual es el máximo permitido (MAXLOGSIZE=DATASIZE/10).
	
	Y volver a preguntar.

	Almacenar este valor en la variable MAXLOGSIZE.

	Esto se solicita para evitar el crecimiento indiscriminado de los archivos de log con el correr del tiempo. 

	\item {\bf Definir el directorio de ejecutables}
	
	Mostrar (y grabar en el log)  el siguiente mensaje:
	
	\begin{verbatim}"Nombre del directorio de ejecutables: ($CURRDIR/bin)"\end{verbatim}

	Si el usuario acepta el nombre propuesto, continuar.

	Si el usuario lo desea cambiar, debe ingresar un nombre de directorio (p.e. “ejecutables”).

	Almacenar el nombre en la variable BINDIR.

	\item {\bf Mostrar (y grabar en el log)  la  estructura de directorios resultante}

	Limpiar la pantalla y Mostrar el siguiente mensaje:

\begin{verbatim}
 "PARÁMETROS DE INSTALACION DE Segmentar " 
" ======================================"
"Versión de Perl:   $PERLVER"
"Nombre del directorio de instalación:   $CURRDIR/inst"
"Nombre del directorio de configuración: $CURRDIR/conf"
"Nombre del directorio de ejecutables:   $CURRDIR/$BINDIR"
"Nombre del directorio de datos:         $CURRDIR/$DATADIR"
"Nombre del directorio de logs:          $CURRDIR/$LOGDIR"
"Espacio máximo para archivos de log:    $MAXLOGSIZE"
\end{verbatim}

	\item {\bf Confirmar Inicio de Instalación}

	Mostrar (y grabar en el log)  el siguiente mensaje:

	\begin{verbatim}"Continuar instalación? Si – No."\end{verbatim}

	Si el usuario acepta, continuar.
	
	Si el usuario no acepta limpiar la pantalla y volver al punto anterior adecuado mostrando como valores default los que el usuario ingresó recientemente (contenidos en las variables: BINDIR, DATADIR, LOGDIR, MAXLOGSIZE, etc.).

	Cualquier otra cosa, seguir en este punto.

	\item {\bf Crear la estructura de Directorios}

	Crear la siguiente estructura dependiendo del directorio \$CURRDIR.

	\begin{verbatim}
	/$BINDIR
	/$DATADIR
	/$DATADIR/preparados
	/$DATADIR/preparados/proc
	/$DATADIR/listos
	/$DATADIR/listos/proc
	/$DATADIR/ya
	/$DATADIR/rechazados
	/$LOGDIR
	\end{verbatim}

	Mostrar (y grabar en el log)  el siguiente mensaje:

	\begin{verbatim}"Creando Estructura de Directorio..."\end{verbatim}

	\item {\bf Mover archivos}
	
	Mostrar (y grabar en el log)  el siguiente mensaje:

	\begin{verbatim}"Moviendo Archivos..."\end{verbatim}

	\begin{enumerate}
		\item Mover las tablas de configuración a \$CURRDIR/conf.
		\item Mover las funciones de apoyo a BINDIR (si corresponde).
		\item Instalar INICIAR (si corresponde).
			
			Mover INICIAR al directorio BINDIR.

			Mostrar el siguiente mensaje:

			\begin{verbatim}"    Instalación del componente INICIAR completada.”\end{verbatim}
		\item Instalar DETECTAR (si corresponde).

			Mover DETECTAR al directorio BINDIR.

			Mostrar (y grabar en el log)  el siguiente mensaje:
			
			\begin{verbatim}"    Instalación del componente DETECTAR completada”\end{verbatim}
		\item Instalar TRUNCAR (si corresponde).
			Mover TRUNCAR al directorio BINDIR.

			Mostrar (y grabar en el log)  el siguiente mensaje:
		
			\begin{verbatim}"    Instalación del componente TRUNCAR completada”\end{verbatim}
		\item Instalar AUDITAR (si corresponde).

			Mover AUDITAR al directorio BINDIR.

			Mostrar (y grabar en el log)  el siguiente mensaje:

			\begin{verbatim}"    Instalación del componente AUDITAR completada”\end{verbatim}
		\item Instalar SEGMENTAR (si corresponde).

			Mover SEGMENTAR a BINDIR.
			
			Mostrar (y grabar en el log)  el siguiente mensaje:
			
			\begin{verbatim}"    Instalación del componente SEGMENTAR completada”\end{verbatim}

		\item Mover todo otro archivo donde se considere apropiado

	\end{enumerate}
	\item {\bf Guardar la información de Instalación}

	Almacenar la siguiente información en el archivo segmentar.conf en el directorio \$CURRDIR/conf.
	
	El formato de cada una de las líneas del archivo de configuración es:

	Nombre de la variable espacio signo igual espacio contenido de la variable, Ej: 
	
	TRUNCAR = TRUNCAR

\begin{verbatim}
Línea 01: CONFDIR = /conf
Línea 02: DATADIR = $DATADIR
Línea 03: LOGDIR = $LOGDIR
Línea 04: MAXLOGSIZE = $MAXLOGSIZE
Línea 05: UMXLOGSIZE = <unidad de medida de maxlogsize>
Línea 06: PERLVER = $PERLVER
Línea 07: 
Línea 08: 
Línea 09: 
Línea 10: TRUNCAR = nombre físico del comando TRUNCAR
Línea 11: BINDIR = $BINDIR 
Línea 12: USERID = Usuario de la instalación
Línea 13: FECINS = fecha de instalación
Línea 14: SLEEPT = 5
Línea 15: INICIAR = nombre físico del Comando INICIAR
Línea 16: BINDIR = $BINDIR
Línea 17: USERID = Usuario de la instalación
Línea 18: FECINS = fecha de instalación
Línea 19: 
Línea 20: AUDITAR = Nombre físico del Comando AUDITAR
Línea 21: BINDIR = $BINDIR
Línea 22: USERID = Usuario de la instalación
Línea 23: FECINS = fecha de instalación
Línea 24: 
Línea 25: DETECTAR = nombre físico del comando DETECTAR
Línea 26: BINDIR = $BINDIR
Línea 27: USERID = Usuario de la instalación
Línea 28: FECINS = fecha de instalación
Línea 29: SLEEPD = 1
Línea 30: segmentar.pl = nombre físico del comando perl SEGMENTAR
Línea 31: BINDIR = $BINDIR 
Línea 32: USERID = Usuario de la instalación
Línea 33: FECINS = fecha de instalación
Línea 34: 
\end{verbatim}

Línea 35 y siguientes: disponibles para su uso por parte del instalador, configurador o el sistema.
Este archivo permitirá independizar los scripts no solo de los path sino también del nombre físico del comando.

	\item {\bf Borrar archivos temporarios, si los hubiese generado.}

	\item {\bf Mostrar mensajes indicando que fue lo que se instaló.}

	Ejemplo:
\begin{verbatim}
***********************************************************
* Proceso de Instalación Concluido                        *
* Se encuentran instalados los siguientes componentes:    *
* Componente segmentar.pl: path completo, fecha y usuario *
* Componente INICIAR: path completo, fecha y usuario *
* Componente AUDITAR: path completo, fecha y usuario *
* Componente TRUNCAR: path completo, fecha y usuario *
* Componente DETECTAR: path completo, fecha y usuario *
*          Copyright TPSistemasOp (c)2009                 *
***********************************************************
Presione ENTER para finalizar
\end{verbatim}

	\item {\bf Cerrar el archivo de log}
		
		Grabar en el archivo de log: 

		\begin{verbatim}<Fecha y hora actual>-<Usuario>-Fin de Ejecución.\end{verbatim}

		Cerrar el archivo.
\end{enumerate}

\newpage
\section{Comando de Inicialización de Ambiente}
{\large Nombre del Comando: {\bf INICIAR} }

\subsubsection{Archivos de Input}
\begin{itemize}
	\item \$CURRDIR/conf/segmentar.conf
\end{itemize}
\subsubsection{Archivos de Output}
\begin {itemize}
	\item A especificar por el desarrollador.
\end{itemize}
\subsubsection{Opciones y Parámetros}
\begin{itemize}
	\item A especificar por el desarrollador.
\end{itemize}

\subsubsection{Descripción}

Este comando debe ser el primero en orden de ejecución. Se dispara manualmente. No graba archivo de Log. Este comando es del tipo demonio.

El propósito de este comando es preparar el entorno de ejecución del TP (ambiente). Debe efectuar el seteo inicial de las variables de ambiente, debe activar al comando TRUNCAR y debe ofrecer invocar al demonio DETECTAR siempre que DETECTAR no se esté ejecutando. 

\subsubsection{Pasos sugeridos:}
\begin{enumerate}
	\item Verificar la existencia del archivo de configuración segmentar.conf. Si no existe terminar el comando.
	\item Setear las variables de ambiente siempre y cuando sea la primera vez que se ejecuta INICIAR en esta sesión de usuario.
	\begin{enumerate}
		\item Dentro del seteo de variables se incluyen:
		\begin{itemize}
			\item La variable PATH, para permitir la correcta ejecución de los scripts por parte de usuarios que no son root.
			\item La variable \$CURRDIR, para evitar el hardcode de directorios.
			\item Otras variables que se consideren necesarias: BINDIR – LOGDIR –, etc.
		\end{itemize}
		\item Si el ambiente ya fue inicializado, entonces solo mostrar mensajes indicativos con las variables y sus valores.
	\end{enumerate}
	\item Arrancar el comando TRUNCAR (el nombre físico del comando se obtiene del archivo de configuración).
	\item Ofrecer Arrancar el comando DETECTAR (el nombre físico del comando se obtiene del archivo de configuración) siempre que:
	\begin{itemize}
		\item Se encuentren instalados todos los componentes del sistema.
		\item DETECTAR no se esté ejecutando.
	\end{itemize}
	\begin{enumerate}
		\item Mostar el mensaje: \begin{verbatim}"Efectuar la activación del demonio DETECTAR?" Si - No\end{verbatim}
		\item Si arranca el demonio, mostrar mensaje indicando que esta activado y bajo que numero de proceso.
		
			\begin{verbatim}Demonio corriendo bajo el no.: <Process Id de Detectar>.\end{verbatim}
		\item Si el usuario no desea arrancar el demonio, entonces Mostrar el siguiente mensaje:
		
			\begin{verbatim} "La activación manual del demonio debe hacerse de la siguiente forma: <describir como invocar el comando>"\end{verbatim}
	\end{enumerate}
	\item Se sugiere usar en este comando funciones externas auxiliares como ser:
	\begin{itemize}
		\item Función para verificar el Process Id de cualquier comando.
		\item Función para detener la ejecución de cualquier comando.
	\end{itemize}
\end{enumerate}

\newpage
\section{Comando de Detección de Archivos}
{\large Nombre del Comando: {\bf DETECTAR} }

\subsubsection{Archivos de Input}
\begin{itemize}
	\item Tabla de Centrales \$CURRDIR/conf/centrales.dat
	\item Archivo de Configuración \$CURRDIR/conf/segmentar.conf
	\item Archivos (cualesquiera) que arriban al directorio \$CURRDIR/\$DATADIR
\end{itemize}
\subsubsection{Archivos de Output}
\begin{itemize}
	\item Archivos para Auditar \$CURRDIR/\$DATADIR/preparados/aaaammdd.<central>
	\item Archivo de Log \$CURRDIR/\$LOGDIR/<nombre del comando>.log
	\item Archivos Rechazados  \$CURRDIR/\$DATADIR/rechazados
\end{itemize}
\subsubsection{Opciones y Parámetros}
\begin{itemize}
	\item A especificar por el desarrollador
\end{itemize}

\subsubsection{Descripción}

Este comando puede ser disparado manualmente o a través del comando INICIAR. Graba en el archivo de Log. No se puede ejecutar este comando si la inicialización de ambiente no fue realizada.

El propósito de este comando es DETECTAR el arribo de archivos al directorio DATADIR. Si los archivos son validos, entonces ponerlos a disposición de AUDITAR. Si los archivos no son válidos,  rechazarlos. En caso de haber archivos preparados para AUDITAR, DETECTAR debe invocar el comando AUDITAR.

Este comando es un proceso del tipo “Demonio”

\subsubsection{Pasos sugeridos:}
\begin{enumerate}
	\item Chequear la existencia de archivos en el directorio \$DATADIR.
	\item Si existen archivos, por cada archivo que se detecta.
	\begin{enumerate}
		\item Verificar si es un archivo de clientes: Los archivos de clientes son los que tienen un nombre con el siguiente formato: aaaammdd.<central>.
		\begin{enumerate}
			\item Para verificar la primera parte del nombre se debe verificar que la fecha sea válida.
			\item  Para verificar la segunda parte del nombre se debe verificar que la central exista en el archivo centrales.dat.
		\end{enumerate}
		\item Si el nombre del archivo es correcto, entonces Grabar en el archivo de log: Fecha y hora actual, Usuario, y “Se detecta archivo de clientes: <nombre del archivo>“.
		\begin{enumerate}
			\item Mover el archivo a \$DATADIR/preparados.
		\end{enumerate}
		\item Si el nombre del archivo NO es correcto, entonces Grabar en el archivo de log: Fecha y hora actual, Usuario, y “Se rechaza el archivo: <nombre del archivo>“.
		\begin{enumerate}
			\item Mover el archivo a \$DATADIR/rechazados.
		\end{enumerate}
	\end{enumerate}
	\item Si existen archivos preparados para AUDITAR, es decir que en \$DATADIR/preparados hay archivos.
	\begin{enumerate}
		\item Invocar al Comando Auditar.
	
		Se debe invocar AUDITAR siempre que se haya algún archivo en \$DATADIR/preparados y AUDITAR no se esté ejecutando.
			
		Si arranca correctamente se debe mostrar y Grabar en el archivo de log: Fecha y hora actual, Usuario, y “AUDITAR corriendo bajo el número: <process id de AUDITAR > “

		Si da algún tipo de error se debe mostrar y grabar en el log un mensaje de error.
	\end{enumerate}
	\item Dormir un tiempo SLEEPD (que se obtiene del archivo de configuración).
	\item Volver al punto 1.
\end{enumerate}

\newpage
\section{Comando de Auditoria de Archivos}
{\large Nombre del Comando: {\bf AUDITAR} }

\subsubsection{Archivos de Input}
\begin{itemize}
	\item Tabla de Antenas \$CURRDIR/conf/antenas.dat
	\item Tabla de Morosidad \$CURRDIR/conf/morosos.dat
	\item Archivo de Configuración \$CURRDIR/conf/segmentar.conf
	\item Archivos para Auditar \$CURRDIR/\$DATADIR/preparados/aaaammdd.<central>
\end{itemize}

\subsubsection{Archivos de Output}
\begin{itemize}
	\item Archivo de Universo \$CURRDIR/\$DATADIR/listos/universo.adsl
	\item Archivo de Log \$CURRDIR/\$LOGDIR/<nombre del comando>.log
	\item Archivos Rechazados  \$CURRDIR/\$DATADIR/rechazados
	\item Archivos Auditados \$CURRDIR/\$DATADIR/preparados/proc/aaaammdd.<central>
\end{itemize}
\subsubsection{Opciones y Parámetros}
\begin{itemize}
	\item A especificar por el desarrollador.
\end{itemize}

\subsubsection{Descripción}
Este comando solo puede ser disparado automáticamente a través del comando Detectar. Graba en el archivo de Log cuando:
\begin{itemize}
	\item Empieza a procesar un archivo.
	\item Finaliza el procesamiento de un archivo.
\end{itemize}

El propósito de este comando es validar los Archivos de Clientes registro a registro y generar un archivo universo que sirva para efectuar la segmentación de campañas.

\subsubsection{Pasos sugeridos}
\begin{enumerate}
	\item Inicializar el archivo de log grabando: fecha y hora, usuario, Inicio de Auditoria.
	\item Grabar en el Log: Cantidad de Archivos a Auditar: <cantidad>.
	\item Por cada archivo a Auditar se debe:
	\begin{enumerate}
		\item Verificar que no sea un archivo duplicado. Para ello se debe verificar que en el directorio \$DATADIR/preparados/proc no exista ningún archivo con el mismo nombre. 
		\begin{enumerate}
			\item Si existe un archivo con el mismo nombre, entonces rechazar el archivo.
			\begin{itemize}
				\item Grabar en el archivo de log: Fecha y hora actual, Usuario, y “Archivo Duplicado: <nombre del archivo>“.
				\item Mover el archivo a \$DATADIR/rechazados.
			\end{itemize}
			\item Si el archivo no esta duplicado, continuar con el proceso.
		\end{enumerate}
		\item Grabar en el Log: fecha y hora, usuario, Auditando Archivo <nombre del archivo>
		\item Por cada registro de input.
		\begin{enumerate}
			\item Armar el registro de salida de la forma que se indica mas abajo
			\item Grabar el registro en el archivo universo.adsl. 
			
			Si el Archivo Universo ya existe, agregarle los nuevos registros. Si no existe, crearlo.
		\end{enumerate}
		\item Repetir el paso 3.c hasta que se termine el archivo. 
		\item Por cada Archivo procesado:
		\begin{enumerate}
			\item Grabar en el Log: fecha y hora, usuario, Cantidad de Registros de Input <cantidad>
			\item Grabar en el Log: fecha y hora, usuario, Cantidad de Registros de Output <cantidad>
			\item Mover el archivo procesado a: \$CURRDIR/\$DATADIR/preparados/proc
		\end{enumerate}
	\end{enumerate}
	\item Repetir el paso 3 hasta que se terminen todos los archivos a AUDITAR.
	\item Cerrar el archivo de log grabando: fecha y hora, usuario, Fin de Auditoria
\end{enumerate}

\subsubsection{Registro Universo.adsl}
\begin{center}
\begin{tabular}{|p{4cm}|p{11.5cm}|} \hline
	Código de Central & Se obtiene del nombre del archivo. Ya fue validado por detectar \\ \hline
	Código de Cliente & Ídem campo del mismo nombre del registro de Input \\ \hline
	Código de Área & Ídem campo del mismo nombre del registro de Input \\ \hline
	Zona 3G & Grabar “S” cuando en la tabla {\ttfamily [antenas.dat]} con la clave {\ttfamily [código de área]} el campo {\ttfamily [Antena 3G]} indica que hay antena 3g en esa área. \newline Cualquier otro caso grabar “N”. \\ \hline
Número de Línea &  Ídem campo del mismo nombre del registro de Input  \\ \hline
Promedio Facturación & Ídem campo del mismo nombre del registro de Input  \\ \hline
Grado de Morosidad & Grabar “1” cuando en la tabla {\ttfamily [morosos.dat]} con la clave {\ttfamily [código de cliente]} el campo {\ttfamily [Grado de Morosidad]} indica el valor 01. \newline
Grabar “2” cuando en la tabla {\ttfamily [morosos.dat]} con la clave {\ttfamily [código de cliente]} el campo {\ttfamily [Grado de Morosidad]} indica el valor 02. \newline
Grabar “3” cuando en la tabla {\ttfamily [morosos.dat]} con la clave {\ttfamily [código de cliente]} el campo {\ttfamily [Grado de Morosidad]} indica el valor 03. \newline 
Grabar “4” cuando en la tabla {\ttfamily [morosos.dat]} con la clave {\ttfamily [código de cliente]} el campo {\ttfamily [Grado de Morosidad]} indica el valor 04. \newline 
Grabar “5” cuando en la tabla {\ttfamily [morosos.dat]} con la clave {\ttfamily [código de cliente]} el campo {\ttfamily [Grado de Morosidad]} indica el valor 05. \newline 
Cualquier otro caso grabar “0”  \\ \hline
Importe de Deuda & Grabar el valor obtenido de la tabla {\ttfamily [morosos.dat]} con la clave {\ttfamily [código de cliente]} del campo [Importe de Deuda]. \newline 
Cuando el Grado de Morosidad determinado en el paso anterior es 00, importe de deuda también debe ser cero.  \\ \hline
Marca IUR & Grabar “S” cuando el campo {\ttfamily Llamadas Interurbanas} del registro de Input indica que hay llamadas interurbanas. 
Cualquier otro caso grabar “N”  \\ \hline
Marca INT & Grabar “S” cuando el campo {\ttfamily Llamadas Internacionales} del registro de Input indica que hay llamadas internacionales. \newline 
Cualquier otro caso grabar “N”  \\ \hline
Marca ADSL & Grabar “N” cuando el campo {\ttfamily Operadora ADSL} del registro de Input indica el valor “Ninguna” Cualquier otro caso grabar “S”  \\ \hline
Marca CABA & Grabar “S” cuando el campo {\ttfamily Territorio} del registro de Input indica el valor “Centro” Cualquier otro caso grabar “N”  \\ \hline
Marca GBAOes & Grabar “S” cuando el campo {\ttfamily Territorio} del registro de Input indica el valor “GBAOes” Cualquier otro caso grabar “N”  \\ \hline
Marca GBANor & Grabar “S” cuando el campo {\ttfamily Territorio} del registro de Input indica el valor “GBANor” Cualquier otro caso grabar “N”  \\ \hline
Marca Country & Grabar “S” cuando el campo {\ttfamily Tipo Territorio} del registro de Input indica el valor “Country” Cualquier otro caso grabar “N”  \\ \hline
Marca Delta & Grabar “S” cuando el campo {\ttfamily Tipo Territorio} del registro de Input indica el valor “Delta” Cualquier otro caso grabar “N” \\ \hline
Marca Rural & Grabar “S” cuando el campo {\ttfamily Tipo Territorio} del registro de Input indica el valor “Rural” Cualquier otro caso grabar “N” \\ \hline
Marca Jub & Grabar “S” cuando el campo {\ttfamily Categoría de Abono} del registro de Input indica el valor “Jub” Cualquier otro caso grabar “N” \\ \hline
Marca Res & Grabar “S” cuando el campo {\ttfamily Categoría de Abono} del registro de Input indica el valor “Res” Cualquier otro caso grabar “N” \\ \hline
Marca CF & Grabar “S” cuando el campo {\ttfamily Categoría de Cliente} del registro de Input indica el valor “CF” Cualquier otro caso grabar “N” \\ \hline
Marca MO & Grabar “S” cuando el campo {\ttfamily Categoría de Cliente} del registro de Input indica el valor “MO” Cualquier otro caso grabar “N” \\ \hline
Marca RI & Grabar “S” cuando el campo {\ttfamily Categoría de Cliente} del registro de Input indica el valor “RI” Cualquier otro caso grabar “N” \\ \hline
Fecha de Corte & Se obtiene del nombre del archivo  \\ \hline
\end{tabular}
\end{center}

\newpage
\section{Comando de Segmentación}
{\large Nombre del Comando: {\bf Segmentar} }

\subsubsection{Archivos de Input}
\begin{itemize}
	\item Tabla de Campañas \$CURRDIR/conf/campanas.dat
	\item Archivo de Universo \$CURRDIR/\$DATADIR/listos/universo.adsl
\end{itemize}
\subsubsection{Archivos de Output}
\begin{itemize}
	\item Archivos de Segmentos \$CURRDIR/\$DATADIR/ya/segmento.<código campaña>
	\item Archivo de Universo Procesado \$CURRDIR/\$DATADIR/listos/proc/universo.adsl
\end{itemize}
\subsubsection{Opciones y Parámetros de Invocación}
\begin{itemize}
	\item Opción –g <código de campaña> <p1> <p2> <p3> <p4> …
	\item Opción –e <código de campaña> <coeficiente estimación> 
	\item Otras Opciones y parámetros a definir por el desarrollador
\end{itemize}

\subsubsection{Descripción}

Este comando se dispara manualmente. Graba en el archivo de Log. El propósito de este comando es:
\begin{itemize}
	\item Para la opción g Generar el Archivo de Segmentación.
	\item Para la opción e Estimar el Ingreso por Campaña.
\end{itemize}

Si al invocarlo ya existe otro comando SEGMENTAR en ejecución, terminar la ejecución del presente comando.

NOTA: El desarrollador debe elegir cual es el carácter que se empleará como comodín (wildcard). En la explicación se usará el carácter * para representarlo pero el desarrollador tiene libertad absoluta para emplear otro a su elección.

\subsubsection{Pasos sugeridos para la opción –g}
\begin{enumerate}
	\item Inicializar el archivo de log grabando: fecha, hora, usuario, Inicio de Segmentación.
	\item Solicitar los parámetros.
	\item Verificar la campaña.
	\begin{enumerate}
		\item Verificar que el código de campaña exista en el archivo campanas.dat
		\item Si no existe, mostrar un mensaje indicativo al operador, grabar el error en el log, solicitar nuevamente los parámetros. Seguir en 2.
	\end{enumerate}
	\item Verificar los parámetros.
	\begin{enumerate}
		\item En la invocación de segmentar con la opción –g es posible usar luego del código de campaña hasta 16 parámetros posicionales separados por espacio, en el siguiente orden y con la siguiente correspondencia.
		\begin{center}
		\begin{tabular}{|l|l|} \hline
			Marca ADSL & Parámetro 1 – obligatorio \\ \hline
			Zona 3G & Parámetro 2 – obligatorio \\ \hline
			Grado de Morosidad & Parámetro 3 – obligatorio \\ \hline
			Promedio Facturación & Parámetro 4 – obligatorio \\ \hline
			Código de Central & Parámetro 5  \\ \hline
			Marca IUR & Parámetro 6 \\ \hline
			Marca CABA & Parámetro 7 \\ \hline
			Marca GBAOes & Parámetro 8 \\ \hline
			Marca GBANor & Parámetro 9 \\ \hline
			Marca Country & Parámetro 10 \\ \hline
			Marca Delta & Parámetro 11 \\ \hline
			Marca Rural & Parámetro 12 \\ \hline
			Marca Jub & Parámetro 13 \\ \hline
			Marca Res & Parámetro 14 \\ \hline
			Marca CF & Parámetro 15 \\ \hline
			Marca RI & Parámetro 16 \\ \hline
		\end{tabular}
		\end{center}
		\item Validar los primeros cuatro parámetros.
		\begin{enumerate}
			\item valores posibles parámetro 1: S-N-* 
			\item valores posibles parámetro 2: S-N-* 
			\item valores posibles parámetro 3: 0-1-2-3-4-*
			\item valores posibles parámetro 4: <nro entero >= 0>-*
		\end{enumerate}
		\item Si es informado validar el parámetro 5. Valores posibles: <código de central>-* 
		\item Si son informados validar los parámetros 6 al 16. Valores posibles: S-N-* 
		\item Si la invocación da error, mostrar un mensaje indicativo al operador, grabar el error en el log, solicitar nuevamente los parámetros. Seguir en 2.
		\item Si la invocación fue OK, grabar en el archivo de log los parámetros de invocación.
	\end{enumerate}
	\item Recorrer los registros del universo.adsl y filtrar sus registros de acuerdo a los valores para los parámetros ingresados y con los siguientes operadores de comparación.
	\begin{center}
	\begin{tabular}{|l|l|} \hline
		Marca ADSL & Operador igual \\ \hline
		Zona 3G & Operador igual \\ \hline
		Grado de Morosidad & Operador Menor o igual \\ \hline
		Promedio Facturación & Operador Mayor o igual \\ \hline
		Código de Central & Operador igual \\ \hline
		Marca IUR & Operador igual \\ \hline
		Marca CABA & Operador igual \\ \hline
		Marca GBAOes & Operador igual \\ \hline
		Marca GBANor & Operador igual \\ \hline
		Marca Country & Operador igual \\ \hline
		Marca Delta & Operador igual \\ \hline
		Marca Rural & Operador igual \\ \hline
		Marca Jub & Operador igual \\ \hline
		Marca Res & Operador igual \\ \hline
		Marca CF & Operador igual \\ \hline
		Marca RI & Operador igual \\ \hline
	\end{tabular}
	\end{center}
	\begin{enumerate}
		\item Si el valor ingresado para el parámetro es el comodín (* en esta explicación), esto representa cualquier valor para ese campo.
		\item Si el valor ingresado para el parámetro es un valor distinto del comodín,  comparar el valor ingresado con el valor del campo en el registro empleando el operador de comparación indicado. 
		\item Si el registro pasa el filtro, grabarlo en el archivo de Segmentos correspondiente \$CURRDIR/\$DATADIR/ya/segmento.<código campaña>
		\begin{enumerate}
			\item Si el Archivo ya existe, agregarle los nuevos registros. Si no existe, crearlo.
		\end{enumerate}
	\end{enumerate}
	\item Repetir el paso 5 hasta que se termine el archivo universo.
	\item Grabar en el archivo de log “Campaña <código campaña> Segmentada”
	\item Preguntar al usuario si desea generar otra segmentación
	\begin{enumerate}
		\item Si responde si, volver a 1.
		\item Si responde no, seguir en el siguiente paso.
	\end{enumerate}
	\item Preguntar al usuario si desea mover el universo procesado para evitar su reprocesamiento.
	\begin{enumerate}
		\item Si responde si, Mover el archivo universo a: \$CURRDIR/\$DATADIR/listos/proc.
	\end{enumerate}
	\item Cerrar el archivo de log grabando: fecha y hora, usuario, Fin de Proceso.
\end{enumerate}

\subsubsection{Pasos sugeridos para la opción –e}
\begin{enumerate}
	\item Inicializar el archivo de log grabando: fecha, hora, usuario, Inicio de Estimación.
	\item Solicitar los parámetros.
	\item Verificar los parámetros.
	\begin{enumerate}
		\item Verificar que el código de campaña exista en el archivo campanas.dat
		\item En la invocación de segmentar con la opción –e es posible usar luego del código de campaña un parámetro opcional que representa el coeficiente de estimación. Este valor debe estar comprendido entre 0.01 y 0.99.
		\item Si algún parámetro da error, mostrar un mensaje indicativo al operador, grabar el error en el log, solicitar nuevamente los parámetros. Seguir en 2.
		\item Si la invocación fue OK, grabar en el archivo de log los parámetros de invocación.
	\end{enumerate}
	\item Obtener las tarifas correspondientes a la campaña del archivo campanas.dat
	\item Recorrer los registros del archivo segmento.<codigo de campaña>. 
	\begin{enumerate}
		\item Determinar la cantidad de lineas x central  usando una estructura hash (obligatorio). Llamamos Q a este valor.
		\item Cuando se termina el archivo segmento.<código de campaña> elaborar el siguiente informe:
	\begin{verbatim}
	Para la Campaña <código de campaña>: <descripción>
	En la Central <código de central 1> existen = <Q> Lineas Candidatas.
	La estimacion de Clientes Potenciales es = <Q * coeficiente>
	Tasa de abandono para el primer trimestre: 10%
	Tasa de abandono para el segundo trimestre: 30%

	Bajo esta estimacion los ingresos promedio de la campaña en el proximo semestre serán:
 
	Mes 1: $ Q*coeficiente*(tarifa1)
	Mes 2: $ Q*coeficiente*(tarifa2)
	Mes 3: $ Q*coeficiente*(tarifa3)
	Mes 4: $ Q*coeficiente*(tarifa4)
	Mes 5: $ Q*coeficiente*(tarifa5)
	Mes 6: $ Q*coeficiente*(tarifa6)

	Promedio para el Pimer Trimestre   (Meses 1 al 3):  [(Mes1 + Mes2 + Mes3) *0.90]/3
	Promedio para el Segundo Trimestre   (Meses 4 al 6):  [(Mes4 + Mes5 + Mes6) *0.70]/3
	Promedio del semestre =  (Promedio Pimer Trimestre   + Promedio Segundo Trimestre)/2
	\end{verbatim}
	\end{enumerate}
	\item Grabar el informe en el archivo de log
	\item Mostrar el informe por pantalla
	\item Grabar en el archivo de log “Fin Estimación”
	\item Preguntar al usuario si desea generar otra estimación
	\begin{enumerate}
		\item Si responde si, volver a 1.
		\item Si responde no, terminar el programa.
	\end{enumerate}

\end{enumerate}

\newpage
\section{Función para movimiento de archivos}
{\large Nombre del Comando: {\bf MOVER} }
\subsubsection{Archivo de Input}
\begin{itemize}
	\item Archivo definido en el parámetro 1.
\end{itemize}
\subsubsection{Archivos de Output}
\begin{itemize}
	\item Archivo definido en el parámetro 2.
	\item Archivo de Log del comando que la invoca (si corresponde).
\end{itemize}
\subsubsection{Opciones y Parámetros}
\begin{itemize}
	\item Parámetro 1 (obligatorio): origen
	\item Parámetro 2 (obligatorio): destino
	\item Parámetro 3 (opcional): comando que la invoca
	\item Parámetro 4 (opcional): Información Adicional
	\item Si son necesarios mas, especificar por el desarrollador.
\end{itemize}

\subsubsection{Descripción}

Esta función tiene por objeto mover un archivo de un directorio a otro contemplando la posibilidad de archivos duplicados. Puede ser invocada desde la línea de comando o bien desde otro comando.

\subsubsection{Pasos sugeridos}
\begin{enumerate}
	\item Antes de efectuar el movimiento, debe:
	\begin{enumerate}
		\item Verificar si el origen y el destino son iguales, no hacer nada.
		\item Verificar si es un archivo duplicado, es decir, si en el destino ya existe un archivo con ese mismo nombre. En este caso debe:
		\begin{enumerate}
			\item Ver si existe dentro del directorio destino un subdirectorio /dup.
			\begin{itemize}
				\item Si no existe, crearlo.
				\item Mover el archivo a ese subdirectorio con el siguiente nombre: <nombre del archivo original>.nnn dónde nnn es un número de secuencial que evita nombres duplicados.
			\end{itemize}
		\end{enumerate}
		\item Si no es un archivo duplicado, entonces hacer el move al destino indicado.
	\end{enumerate}
	\item Si esta función es invocada por un comando que graba en el archivo de log, actualizarlo indicando el resultado de la operación.
	\begin{enumerate}
		\item Ejemplo: Si el move no tuvo complicaciones Grabar en el Log:
		\begin{verbatim} <fecha y hora actual>-<Usuario>-Mover EXITOSO de <parámetro 1> a <parámetro 2> 
		solicitado por: - <parámetro 3> - Info Adicional: <parámetro 4> \end{verbatim}
	\end{enumerate}
	\item Debe devolver un código de retorno cero (0) si fue exitoso el movimiento o distinto de cero si tuvo errores. 
\end{enumerate}

\newpage
\section{Comando de Control de Logs}
{\large Nombre del Comando: {\bf TRUNCAR} }
\subsubsection{Archivos de Input}
\begin{itemize}
	\item Archivos (cualesquiera) de log que se encuentran en el directorio \$CURRDIR/\$LOGDIR
\end{itemize}
\subsubsection{Archivos de Output}
\begin{itemize}
	\item Archivos (cualesquiera) de log que se encuentran en el directorio \$CURRDIR/\$LOGDIR 
\end{itemize}

\subsubsection{Opciones y Parámetros}
\begin{itemize}
	\item A especificar por el desarrollador.
\end{itemize}

\subsubsection{Descripción}

Este comando solo es activado a través del comando INICIAR. 

No se puede ejecutar este comando si la inicialización de ambiente no fue realizada.

El propósito de este comando es evitar el crecimiento indiscriminado de los archivos de log.

Este comando es un proceso del tipo “Demonio”.

\subsubsection{Pasos sugeridos:}
\begin{enumerate}
	\item Determinar el espacio UTILIZADO por todos los archivos .log del directorio \$LOGDIR.
	\item Comparar el resultado obtenido con MAXLOGSIZE.
	\item Si el espacio UTILIZADO supera el 80\% de MAXLOGSIZE, entonces:
	\begin{enumerate}
		\item Seleccionar el archivo de log X de mayor tamaño y reducirlo dejando al menos los últimos 100 registros (los mas recientes).
		\item Grabar en el archivo de log X: Fecha y hora actual, TRUNCAR y “Por cuestiones de Control de Crecimiento, este archivo se ha reducido”.
		\item Si por algún motivo el archivo no pudo ser modificado, mostrar un mensaje en la consola del operador indicando la situación: Fecha y hora actual, Usuario, y “ADVERTENCIA: el archivo de log <nombre del archivo> no pudo ser truncado“.
	\end{enumerate}
	\item Dormir un tiempo SLEEPT (cuyo valor se obtiene del archivo de configuración).
	\item Volver al punto 1.
\end{enumerate}

\newpage
\section{Estructuras de Archivos}
En todos los casos el separador de campos es la coma (,).

\subsection{Archivo Antenas \$CURRDIR/conf/antenas.dat}
\begin{center}
\begin{tabular}{|l|l|} \hline
	Código de Área & 10 Caracteres \\ \hline
	Antena 3G & Valores posibles: S-N \\ \hline
\end{tabular}
\end{center}

\subsection{Archivo Campañas \$CURRDIR/conf/campanas.dat}
\begin{center}
\begin{tabular}{|l|l|} \hline
Código de Campaña & 3 Caracteres \\ \hline
Descripción de la Campaña & N Caracteres \\ \hline
Tarifa estándar & Numérico de 10 \\ \hline
Tarifa mes 1 & Numérico de 10 \\ \hline
Tarifa mes 2 & Numérico de 10 \\ \hline
Tarifa mes 3 & Numérico de 10 \\ \hline
Tarifa mes 4 & Numérico de 10 \\ \hline
Tarifa mes 5 & Numérico de 10 \\ \hline
Tarifa mes 6 & Numérico de 10 \\ \hline
\end{tabular}
\end{center}

\subsection{Archivo Centrales \$CURRDIR/conf/centrales.dat}
\begin{center}
\begin{tabular}{|l|l|} \hline
	Código de Central & 10 Caracteres \\ \hline
	Ports Disponibles & Numérico de 10 \\ \hline
	Disponibilidad ADSL & Valores posibles: S-N \\ \hline
	Disponibilidad 2.0 & Valores posibles: S-N \\ \hline
	Disponibilidad 5.0 & Valores posibles: S-N \\ \hline
	Disponibilidad 10.0 & Valores posibles: S-N \\ \hline
\end{tabular}
\end{center}

\subsection{Archivo Clientes \$CURRDIR/\$DATADIR/aaaammdd.central}
\begin{center}
\begin{itemize}
	\item \$CURRDIR/\$DATADIR/preparados/aaaammdd.central
	\item \$CURRDIR/\$DATADIR/preparados/proc/aaaammdd.central
\end{itemize}
\begin{tabular}{|l|l|} \hline
	Código de Cliente & 10 Caracteres \\ \hline
	Código de Área & 10 Caracteres \\ \hline
	Número de Línea & 10 Caracteres \\ \hline
	Promedio Facturación últimos 6 meses & Numérico de 10 \\ \hline
	Operadora Local & Valores posibles: TASA-TECO-Otro \\ \hline
	Llamadas Interurbanas & Valores posibles: S-N \\ \hline
	Operadora Internacional & Valores posibles: TASA-TECO-Otro \\ \hline
	Llamadas Internacionales & Valores posibles: S-N \\ \hline
	Operadora ADSL & Valores posibles: TASA-TECO-Otro-Ninguna \\ \hline
	Territorio & Valores posibles: Centro-GBANor-GBASur-GBAOes \\ \hline
	Tipo Territorio & Valores posibles: Country-Delta-Rural-Std \\ \hline
	Categoría de Abono & Valores posibles: Com-Jub-Res \\ \hline
	Categoría de Cliente & Valores posibles: CF-MO-RI-EX \\ \hline
\end{tabular}
\end{center}

\subsection{Archivo Configuración \$CURRDIR/conf/segmentar.conf}
\begin{center}
\begin{tabular}{|l|l|} \hline
	Línea & N Caracteres \\ \hline
\end{tabular}
\end{center}

\subsection{Archivo Log \$CURRDIR/\$LOGDIR/<nombre del comando>.log}
\begin{center}
\begin{tabular}{|l|l|} \hline
	Línea & N Caracteres \\ \hline
\end{tabular}
\end{center}

\subsection{Archivo Morosidad \$CURRDIR/conf/morosos.dat}
\begin{center}
\begin{tabular}{|l|l|} \hline
	Código de Cliente & 10 Caracteres \\ \hline
	Grado de Morosidad & Valores posibles: 00-01-02-03-04-05 \\ \hline
	Importe de Deuda & Numérico de 10 \\ \hline
\end{tabular}
\end{center}

\subsection{Archivo Segmento \$CURRDIR/\$DATADIR/ya/segmento.$<$codigo campaña$>$}
\begin{center}
\begin{tabular}{|l|l|} \hline
	Código de Central & 10 Caracteres \\ \hline
	Código de Cliente & 10 Caracteres \\ \hline
	Código de Área & 10 Caracteres \\ \hline
	Zona 3G & Valores posibles: S-N \\ \hline
	Número de Línea & 10 Caracteres \\ \hline
	Promedio Facturación & Numérico de 10 \\ \hline
	Grado de Morosidad & Valores posibles: 0-1-2-3-4-5 \\ \hline
	Importe de Deuda & Numérico de 10 \\ \hline
	Marca IUR & Valores posibles: S-N \\ \hline
	Marca INT & Valores posibles: S-N \\ \hline
	Marca ADSL & Valores posibles: S-N \\ \hline
	Marca CABA & Valores posibles: S-N \\ \hline
	Marca GBAOes & Valores posibles: S-N \\ \hline
	Marca GBANor & Valores posibles: S-N \\ \hline
	Marca Country & Valores posibles: S-N \\ \hline
	Marca Delta & Valores posibles: S-N \\ \hline
	Marca Rural & Valores posibles: S-N \\ \hline
	Marca Jub & Valores posibles: S-N \\ \hline
	Marca Res & Valores posibles: S-N \\ \hline
	Marca CF & Valores posibles: S-N \\ \hline
	Marca MO & Valores posibles: S-N \\ \hline
	Marca RI & Valores posibles: S-N \\ \hline
	Fecha de Corte & 8 Caracteres aaaammdd \\ \hline
	Fecha de Segmentación & Fecha y Hora de grabación del registro \\ \hline
\end{tabular}
\end{center}

\subsection{Archivo Universo \$CURRDIR/\$DATADIR/listos/universo.adsl}
\begin{center}
\begin{tabular}{|l|l|} \hline
	Código de Central & 10 Caracteres \\ \hline
	Código de Cliente & 10 Caracteres \\ \hline
	Código de Área & 10 Caracteres \\ \hline
	Zona 3G & Valores posibles: S-N \\ \hline
	Número de Línea & 10 Caracteres \\ \hline
	Promedio Facturación & Numérico de 10 \\ \hline
	Grado de Morosidad & Valores posibles: 0-1-2-3-4-5 \\ \hline
	Importe de Deuda & Numérico de 10 \\ \hline
	Marca IUR & Valores posibles: S-N \\ \hline
	Marca INT & Valores posibles: S-N \\ \hline
	Marca ADSL & Valores posibles: S-N \\ \hline
	Marca CABA & Valores posibles: S-N \\ \hline
	Marca GBAOes & Valores posibles: S-N \\ \hline
	Marca GBANor & Valores posibles: S-N \\ \hline
	Marca Country & Valores posibles: S-N \\ \hline
	Marca Delta & Valores posibles: S-N \\ \hline
	Marca Rural & Valores posibles: S-N \\ \hline
	Marca Jub & Valores posibles: S-N \\ \hline
	Marca Res & Valores posibles: S-N \\ \hline
	Marca CF & Valores posibles: S-N \\ \hline
	Marca MO & Valores posibles: S-N \\ \hline
	Marca RI & Valores posibles: S-N \\ \hline
	Fecha de Corte & 8 Caracteres aaaammdd \\ \hline
\end{tabular}
\end{center}

\newpage
\chapter{Glosario}

Ingresar aquí los términos y/o Abreviaturas que considere necesarios.

\section{3}
{\bf 3G}

Telefonía móvil 3G

\section{A}
{\bf ADSL}

Asymmetric Digital Subscriber Line . ADSL son las siglas de Asymmetric Digital Subscriber Line ("Línea de Suscripción Digital Asimétrica"). Es una tecnología de acceso a Internet de banda ancha.

\section{C}
{\bf Carácter Comodín}

Un carácter comodín es un carácter que representa cualquier otro carácter o cadena de caracteres. Algunos de los caracteres comodines que se utilizan en informática son:

 * (asterisco), \% (por ciento), \_ (guión bajo), ? (signo de pregunta). Los caracteres comodines cambian de una aplicación a otra. Por ejemplo en bases de datos es común que los comodines sean \% y \_. Sin embargo en expresiones regulares el caracter comodín por excelencia es el . (punto).

\section{D}
{\bf Demonio}

Un demonio, daemon o dæmon (de sus siglas en inglés Disk And Execution Monitor), es un tipo especial de proceso informático que se ejecuta en segundo plano en vez de ser controlado directamente por el usuario (es un proceso no interactivo). Este tipo de programas se ejecutan de forma continua (infinita).

\section{L}
{\bf Log}

Un log es un registro oficial de eventos durante un periodo de tiempo en particular. Para los profesionales en seguridad informática es usado para registrar datos o información sobre quién, qué, cuándo, dónde y por qué (who, what, when, where y why, W5) un evento ocurre para un dispositivo en particular o aplicación.

También se le considera como aquel mensaje que genera el programador de un sistema operativo, alguna aplicación o algún proceso, en virtud del cual se muestra un evento del sistema. 

\section{T}
{\bf TASA}

Telefónica de Argentina S.A. 

{\bf TECO}

Telecom Argentina

{\bf Telefonía móvil 3G}

3G (o 3-G) es la abreviación de tercera-generación en telefonía móvil. Los servicios asociados con la tercera generación proporcionan la posibilidad de transferir tanto voz y datos (una llamada telefónica) y datos no-voz (como la descarga de programas, intercambio de email, y mensajería instantánea).

